package com.xiefengf.direct;

import com.rabbitmq.client.BuiltinExchangeType;
import com.xiefengf.utils.RabbitUtils;


/**
 * @author xiefengf
 * @version 1.0
 * @date 2023/7/29 23:07
 * <p>
 * Direct方式
 */
public class Direct {

    /**
     * 交换器名
     */
    private static final String EXCHANGE_NAME = "xiefengf.direct.exchange";

    /**
     * 消息
     */
    private static final String MESSAGE = "这是Direct方式 >>> ";

    /**
     * 三个key
     */
    private static final String[] ROUTING_KEY = new String[]{"direct-aaa", "direct-bbb", "direct-ccc"};

    /**
     * 三个队列 --- 如果不手动指定，生产者就会默认生产几个对应的队列。名称也是默认的
     */
    private static final String[] QUEUE_NAMES = new String[]{"direct-wq", "direct-wb", "direct-wc"};

    /**
     * 声明交换机、声明队列、绑定队列到交换机
     */
    public static void directQueue(){
        for (int i = 0; i < QUEUE_NAMES.length; i++) {
            RabbitUtils.queueDeclare(EXCHANGE_NAME,BuiltinExchangeType.DIRECT,QUEUE_NAMES[i],ROUTING_KEY[i % 3]);
        }
    }

    /**
     * Direct方式 生产信息
     */
    public static void directPublish() {
        // 生产消息
        for (int i = 0; i < 10; i++) {
            RabbitUtils.rabbitProducer(EXCHANGE_NAME, ROUTING_KEY[i % 3], MESSAGE + i + " key为：" + ROUTING_KEY[i % 3]);
        }
    }

    /**
     * Direct方式 消费信息
     */
    public static void directConsumer() {
        // 消费消息
        for (String queueName : QUEUE_NAMES) {
            RabbitUtils.rabbitConsumer(queueName);
        }
    }

    public static void main(String[] args) {
        // 声明队列
        directQueue();
        // 生产消息
        directPublish();
        // 消费消息
        directConsumer();
    }

}
